        TITL DAI FIRMWARE 1E414-1E5F7  V1.0  Rev.1
        ORG   :E414
*
*
*
***********************************
* CHANGE CONTENTS MACC TO INTEGER *
***********************************
*
* Entry: None.
* Exit:  All registers preserved.
*
XFIX    PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E133     Copy MACC to ABCD
        PUSH  PSW       Save exp.byte
        ANI   :7F       Exponent only
        JZ    :E43B     Exp=0: Clear MACC, abort
        CPI   :40       Exp negative ?
        JNC   :E43B     Then clear MACC, abort
        SUI   :20       Exp >= 32 ?
        JNC   :E43F     Then run overflow error
        CMA             ) 2-complement of exp
        INR   A         )
        CALL  :EB55     Shift BCDE right A times
        POP   PSW       Get exp byte
        ORA   A
        CM    :E3C9     Nr <0: negate BCDE
        JC    :E322     Jump if overflow
        JMP   :E328     Copy BCDE into MACC, abort
 REM
* If number is 0 or exponent negative:
 REM
L1E65   POP   PSW
        JMP   :E40E     Clear MACC, abort
 REM
* if overflow:
 REM
L1E66   POP   PSW
        JMP   :E322     Run overflow error, abort
*
**************
* FPT INT(X) *
**************
*
* The contents of the MACC is replaced by its
* FPT integer part. The fractional bits of the
* mantissa are masked off.
*
* Exit: All registers preserved.
*
XFINT   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        LXI   H,:00D5   Addr MACC
        MOV   A,M       Get exp.byte
        ANI   :7F       Exponent only
        JZ    :E40E     If exp=0: Clear MACC, abort
        CPI   :40       Exp negative ?
        JNC   :E40E     Then clear MACC, abort
        SUI   :19       Exp - nr of mantissa bits
        LXI   H,:00D8   Addr lobyte MACC
        MVI   E,:03     3 bytes in mantissa
        MOV   D,A       Rest exp in D
L1E68   MVI   C,:08     8 bits pro byte
L1E69   INR   D         Rest exp + 1
        STC             Mask '1' for bits reqd
        JP    :E465     If rest exp >=0
        CMC             Mask '0' for bits not reqd
L1E70   RAR             Shift CY into A to make mask
        DCR   C
        JNZ   :E45F     Next bit if not ready
        ANA   M         Mask MACC byte with mask
        MOV   M,A       Result back in MACC
        DCX   H         Addr next MACC byte
        DCR   E
        JNZ   :E45D     Next byte if not ready
        JMP   :C14D     Popall, ret
*
*********************
* AMD: FPT ADDITION *
*********************
*
* MTOS = MTOS + MEM.
*
* Entry: HL points to operand in memory.
* Exit:  All registers preserved.
*
ZFADD   CALL  :E527     Wait, load, operate imm.
        DATA  :10       FPT addition
        RET
*
************************
* AMD: FPT SUBTRACTION *
************************
*
* MTOS = MTOS - MEM.
*
* Entry: HL points to operand in memory.
* Exit:  All registers preserved.
*
ZFSUB   CALL  :E527     Wait, load, operate imm.
        DATA  :11       FPT subtraction
        RET
*
***************************
* AMD: FPT MULTIPLICATION *
***************************
*
* MTOS = MTOS * MEM.
*
* Entry: HL points to multiplier in memory.
* Exit:  All registers preserved.
*
ZFMUL   CALL  :E527     Wait, load, operate imm.
        DATA  :12       FPT multiplication
        RET
*
*********************
* AMD: FPT DIVISION *
*********************
*
* MTOS = MTOS / MEM.
*
* Entry: HL points to divisor in memory.
* Exit:  All registers preserved.
*
ZFDIV   CALL  :E527     Wait, load, operate imm.
        DATA  :13       FPT division
        RET
*
****************
* AMD: FPT ABS *
****************
*
* MTOS is replaced by its absolute value (FPT).
*
* Entry: None.
* Exit:  All registers preserved.
*
ZFABS   PUSH  PSW
        CALL  :ED95     Get status bits
        NOP
        ADD   A         Test bit 6 (sign)
        CM    :E493     Change sign if reqd (FPT)
        POP   PSW
        RET
*
****************************************
* AMD: CHANGE SIGN MTOS CONTENTS (FPT) *
****************************************
*
* MTOS = - MTOS.
*
* Entry: None.
* Exit:  All registers preserved.
*
ZFCHS   CALL  :E535     Wait, operate immediate
        DATA  :15       FPT change sign MTOS
        RET
*
*******************
* AMD: FPT INT(X) *
*******************
*
* MTOS is replaced by its integer part.
*
ZFINT   CALL  :E4EF     Convert MTOS to INT
 REM
* Entry for AMD: Change MTOS to FPT:
 REM
ZFLT    CALL  :E535     Wait, load, operate imm.
        DATA  :1C       Convert MTOS to FPT
        RET
*
*****************
* AMD: FPT FRAC *
*****************
*
* MTOS is replaced by its fractional part.
*
ZFRAC   CALL  :E535     Wait, load, operate imm.
        DATA  :37       Push MTOS
        CALL  :E498     MTOS = INT(MTOS)
        CALL  :E535     Wait, load, operate imm.
        DATA  :11       Subtract whole number
        RET
*
******************************
* part of AMD: POWER (1EDA1) *
******************************
*
* Entry: HL points to operand in memory.
* Exit:  All registers preserved.
*
MPR14   CALL  :E527     Wait, load, operate imm.
        DATA  :0B       MTOS = MTOS ^ MEM
        RET
*
************
* AMD: LOG *
************
*
ZLN     CALL  :E535     Wait, operate immediate
        DATA  :09       MTOS = LN (MTOS)
        RET
*
************
* AMD: EXP *
************
*
ZEXP    CALL  :E535     Wait, operate immediate
        DATA  :0A       MTOS = E ^ MTOS
        RET
*
*************
* AMD: LOGT *
*************
*
ZLOG    CALL  :E535     Wait, operate immediate
        DATA  :08       MTOS = LOG (MTOS)
        RET
*
*************
* AMD: ALOG *
*************
*
ZALOG   PUSH  H
        LXI   H,:E890   Addr 1/logn(10)
        CALL  :E483     MTOS = MTOS/MEM
        POP   H
        CALL  :E4B6     MTOS = e ^ MTOS
        RET
*
************
* AMD: SQR *
************
*
ZSQRT   CALL  :E535     Wait, operate immediate
        DATA  :01       MTOS = SQRT (MTOS)
        RET
*
************
* AMD: SIN *
************
*
ZSIN    CALL  :E535     Wait, operate immediate
        DATA  :02       MTOS = SIN (MTOS)
        RET
*
************
* AMD: COS *
************
*
ZCOS    CALL  :E535     Wait, operate immediate
        DATA  :03       MTOS = COS (MTOS)
        RET
*
************
* AMD: TAN *
************
*
ZTAN    CALL  :E535     Wait, operate immediate
        DATA  :04       MTOS = TAN (MTOS)
        RET
*
*************
* AMD: ASIN *
*************
*
ZASIN   CALL  :E535     Wait, operate immediate
        DATA  :05       MTOS = ASIN (MTOS)
        RET
*
*************
* AMD: ACOS *
*************
*
ZACOS   CALL  :E535     Wait, operate immediate
        DATA  :06       MTOS = ACOS (MTOS)
        RET
*
************
* AMD: ATN *
************
*
ZATAN   CALL  :E535     Wait, operate immediate
        DATA  :07       MTOS = ATAN (MTOS)
        RET
*
****************************************
* AMD: CHANGE CONTENTS MTOS TO INTEGER *
****************************************
*
ZFIX    CALL  :E535     Wait, operate immediate
        DATA  :1E       MTOS = INT(MTOS)
        RET
*
*********************
* AMD: INT ADDITION *
*********************
*
* MTOS = MTOS + MEM.
*
* Entry: HL points to number in memory.
* Exit:  All registers reserved.
*
ZIADD   CALL  :E527     Wait, load, operate imm.
        DATA  :2C       INT addition
        RET
*
************************
* AMD: INT SUBTRACTION *
************************
*
* MTOS = MTOS - MEM.
*
* Entry: HL points to number in memory.
* Exit:  All registers preserved.
*
ZISUB   CALL  :E527     Wait, load, operate imm.
        DATA  :2D       INT subtraction
        RET
*
***************************
* AMD: INT MULTIPLICATION *
***************************
*
* MTOS = MTOS * MEM.
*
* Entry: HL points to number in memory.
* Exit:  All registers preserved.
*
ZIMUL   CALL  :E527     Wait, load, operate imm.
        DATA  :2E       INT multiplication
        RET
*
*********************
* AMD: INT DIVISION *
*********************
*
* MTOS = MTOS / MEM.
*
* Entry: HL points to number in memory.
* Exit:  All registers preserved.
*
ZIDIV   CALL  :E527     Wait, load, operate imm.
        DATA  :2F       INT division
        RET
*
*****************************
* AMD: INT DIVIDE REMAINDER *
*****************************
*
* MTOS = INT remainder of MTOS / MEM.
*
* Entry: HL points to number in memory.
* Exit:  All registers preserved.
*
ZIREM   CALL  :E535     Wait, operate immediate
        DATA  :37       Push MTOS
        CALL  :E503     INT divide
        CALL  :E4FE     INT multiply back
        CALL  :E535     Wait, operate immediate
        DATA  :2D       Subtract: difference =
 REM remainder
        RET
*
*
*
****************
* AMD: INT ABS *
****************
*
* MTOS = absolute value of MTOS (INT).
*
ZIABS   PUSH  PSW
        CALL  :ED95     Get status bits
        NOP
        ADD   A         Test bit 6 (sign)
        CM    :E522     Change sign MTOS if reqd
        POP   PSW
        RET
*
*******************************
* AMD: CHANGE SIGN MTOS (INT) *
*******************************
*
ZICHS   CALL  :E535     Wait, operate immediate
        DATA  :34       MTOS = - MTOS
        RET
*
**************************************
* AMD: WAIT, LOAD, OPERATE IMMEDIATE *
**************************************
*
* Call has to be followed by a 1 byte AMD command.
*
WLOPI   CALL  :E53B     Wait for ready, evt. error
 REM indications
        CALL  :E588     Load 2nd operand in MTOS
OPI     XTHL            HL pnts to command byte
        PUSH  PSW
        CALL  :ECCC     Issue command to AMD
        POP   PSW
        XTHL            Restore returnaddr
        RET
*
********************************
* AMD: WAIT, OPERATE IMMEDIATE *
********************************
*
* Call has to be followed by a 1 byte AMD command.
*
WOPI    CALL  :E53B     Wait ready, evt. error
 REM indications
        JMP   :E52D     Issue command to AMD
*
*********************************
* AMD: WAIT FOR MATH.CHIP READY *
*********************************
*
* Waits for math.chip ready. Handles eventual
* errors if found.
*
* Exit: If no errors: All registers preserved.
*
WMATH   PUSH  PSW
WMT10   LDA   :FB02     Get status math.chip
        ORA   A
        JM    :E53C     If busy: wait for ready
        ANI   :1E       Error codes only
        JZ    :E55D     Abort if no errors
        NOP
        CALL  :ECD2     Reset AMD status
        RAR
        RAR
        CC    :C04B     Evt. run overflow error
        RAR
        CC    :C065     Evt. run underflow error
        RAR
        CC    :C05E     Evt. run argument error
        RAR
        CC    :C06C     Evt. run divide by 0 error
WMT20   POP   PSW       Normal return
        RET
*
*****************************************
* AMD: COPY REGISTERS A,B,C,D INTO MTOS *
*****************************************
*
ZPUT    PUSH  PSW
        MOV   A,D       D into A
        CALL  :E53B     Wait ready
ZPT10   STA   :FB00     Copy (D) into MTOS
        MOV   A,C       C into A
        STA   :FB00     Copy (C) into MTOS
        MOV   A,B
        JMP   :ECD9     Copy (B)+(A) into MTOS
*
*****************************************
* AMD: COPY MTOS INTO REGISTERS A,B,C,D *
*****************************************
*
ZGET    CALL  :E53B     Wait ready
        LDA   :FB00     Get hibyte from MTOS
        PUSH  PSW       Save it on stack
        LDA   :FB00     Get 2nd byte from MTOS
        MOV   B,A       Store it in B
        LDA   :FB00     Get 3rd byte from MTOS
        MOV   C,A       Store it in C
        LDA   :FB00     Get lobyte from MTOS
        MOV   D,A       Store it in D
        JMP   :E564     Restore MTOS
*
**************
* (not used) *
**************
*
L1E109  MOV   D,L
        POP   H
        RET
*
*******************************
* AMD: COPY OPERAND INTO MTOS *
*******************************
*
* Entry: HL points to 1st byte of operand.
* Exit:  All registers preserved.
*
ZLOAD   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        MOV   A,M       1st byte in A
        INX   H
        MOV   B,M       2nd byte in B
        INX   H
        MOV   C,M       3rd byte in C
        INX   H
        MOV   D,M       4th byte in D
        CALL  :E55F     Copy ABCD into MTOS
        JMP   :C14D     Popall, ret
*
*****************************
* AMD: COPY MTOS TO OPERAND *
*****************************
*
* Entry: HL points to 1st byte of operand.
* Exit:  All registers preserved.
*
ZSAVE   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E56F     Copy MTOS into ABCD
        MOV   M,A       )
        INX   H         )
        MOV   M,B       )
        INX   H         ) Copy ABCD into operand
        MOV   M,C       )
        INX   H         )
        MOV   M,D       )
        JMP   :C14D     Popall, ret
*
************************
* CALCULATE TAYLOR SUM *
************************
*
* Entry: HL points to a list with FPT constants
*        (Mi with i = 0,1,2,...).
*        MACC: Const. term of Taylor series (S0).
*        00E3-E6: Initial power of argument (P).
*        00E7-EA: Argument X.
*
* Routine computes:
* Sum = S0 + M0*P + M1*P*X + M2*P*X^2 + ......
*
* Exit:  00EB-EE: Sum of series.
*        00E3-E6: Last P*X^i added in.
*        00E7-EA: Preserved.
*        MACC + ABCD: Sum of series.
*        FEHL corrupted.
*
L1E112  PUSH  H         Save table pntr
        LXI   H,:00EB
        CALL  :E9D6     Copy MACC (S0) into 00EB-EE
        LXI   H,:00E3
        CALL  :E9FB     Copy 00E3-E6 (P) into MACC
L1E113  POP   H
        PUSH  H         ) Get and save table pntr
        CALL  :EA59     MACC = P * Mi
        LXI   H,:00EB
        PUSH  H
        CALL  :EA72     MACC = sum + P * Mi
        POP   H
        CALL  :E9DB     Result in 00EB-EE
        LDA   :00DE     Get difference in exp
        ORA   A
        JP    :E5D3
        CPI   :E8
        JC    :E5F3
L1E114  POP   H         Get table pntr
        INX   H
        INX   H
        INX   H
        INX   H         HL pnts to next table entry
        PUSH  H         Save table pntr
        INX   H
        MOV   A,M
        ORA   A
        JP    :E5F3     Jump if ready
        LXI   H,:00E3
        PUSH  H
        CALL  :E9FB     Copy 00E3-E6 into MACC
 REM and reg ABCD
        LXI   H,:00E7
        CALL  :EA59     Multiply with 00E7-EA
        POP   H         HL=00E3
        CALL  :E9DB     Copy ABCD into 00E3-E6
        JMP   :E5B7     Calc next sum
*
L1E115  POP   H
        CALL  :E9F8     Copy result into MACC
 REM and reg ABCD
        RET
*
*
*
        END
